package com.quantoeugasto.servico;

import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.quantoeugasto.entidade.Entidade;
import com.quantoeugasto.persistencia.Persistencia;


/**
 * Superclasse de serviço. Contém os métodos básicos de inserção, alteração e exclusão.
 * 
 * @author Fabiano
 */
@SuppressWarnings("rawtypes")
public abstract class Servico <E extends Entidade, P extends Persistencia<E>>{
	
	private P persistencia;

	/**
	 * @return the persistencia
	 */
	protected P getPersistencia() {
		return persistencia;
	}

	/**
	 * @param persistencia the persistencia to set
	 */
	protected void setPersistencia(P persistencia) {
		this.persistencia = persistencia;
	}

	/**
	 * Insere uma entidade no sistema. Deve conter o id nulo.
	 * 
	 * @param entidade Entidade a ser inserida.
	 */
	@Transactional(propagation = Propagation.REQUIRED)
	public void inserir(E entidade){
		this.persistencia.inserir(entidade);
	}
	
	/**
	 * Altera uma entidade no sistema. Deve conter o id preenchido, caso contrário,
	 * a entidade será inserida.
	 * 
	 * @param entidade Entidade a ser alterada no sistema.
	 */
	@Transactional(propagation = Propagation.REQUIRED)
	public void alterar(E entidade){
		this.persistencia.alterar(entidade);
	}
	
	/**
	 * Exclui uma entidade no sistema. Deve conter o id preenchido.
	 * 
	 * @param entidade Entidade a ser excluída.
	 */
	@Transactional(propagation = Propagation.REQUIRED)
	public void excluir(E entidade){
		entidade = this.persistencia.consultar(entidade);
		this.persistencia.excluir(entidade);
	}

	/**
	 * Consulta uma entidade cadastrada pelo identificador.
	 * 
	 * @param entidade Entidade contendo o identificador a ser cadastrado.
	 * @return Entidade com o id informado. Irá retornar null caso não haja notícia com o identificador informado.
	 */
	@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
	public E consultar(E entidade){
		return this.persistencia.consultar(entidade);
	}
	
}
